package routers

import (
	"fmt"
	v1 "gin-blog/api/v1"
	"gin-blog/middleware"
	"gin-blog/utils"
	"gin-blog/utils/msg"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
)

func InitRouter() {
	gin.SetMode(utils.AppMode)
	// 可以用gin.New，也可以用gin.Default，区别是Default里加了两个中间
	r := gin.Default()
	// 使用日志中间件
	r.Use(middleware.Logger())
	// 处理panic()异常，然后返回http code 500，因为go中出现panic()会造成系统崩溃，所以使用这个中间件避免，gin.Default()中已经用了
	r.Use(gin.Recovery())
	// 使用跨域中间件
	r.Use(middleware.Cors())
	// 使用路由组
	// 需要token才能访问的接口
	auth := r.Group("api/v1")
	// 使用JWT中间件
	auth.Use(middleware.JwtToken())
	{
		// 用户模块路由接口
		userGroup := auth.Group("user")
		{
			userGroup.PUT(":id", v1.GetUserById)
			userGroup.PUT("edit", v1.EditUser)
			userGroup.DELETE("delete/:id", v1.DeleteUser)
		}

		// 文章模块路由接口
		categoryGroup := auth.Group("category")
		{
			categoryGroup.POST("add", v1.AddCategory)
			categoryGroup.PUT("edit", v1.EditCategory)
			categoryGroup.DELETE("delete/:id", v1.DeleteCategory)
		}

		// 分类模块路由接口
		articleGroup := auth.Group("article")
		{
			articleGroup.POST("add", v1.AddArticle)
			articleGroup.PUT("edit/:id", v1.EditArticle)
			articleGroup.DELETE("delete/:id", v1.DeleteArticle)
		}

		// 存储模块路由接口
		storageGroup := auth.Group("storage")
		{
			storageGroup.POST("upload", v1.Upload)
		}
	}

	// 不需要token就能使用的接口
	router := r.Group("api/v1")
	{
		// 用户模块路由接口
		userGroup := router.Group("user")
		{
			userGroup.GET("users", v1.GetUsers)
			userGroup.POST("add", v1.AddUser)
			userGroup.POST("login", v1.Login)
		}

		// 文章模块路由接口
		categoryGroup := router.Group("category")
		{
			categoryGroup.GET("categorys", v1.GetCategorys)
		}

		// 分类模块路由接口
		articleGroup := router.Group("article")
		{
			articleGroup.GET("articles", v1.GetArticles)
			articleGroup.GET("info/:id", v1.GetArticleInfo)
			articleGroup.GET("article/list", v1.GetArticleByCategory)
			articleGroup.GET("article/:title", v1.GetArticleByTitle)
		}
	}

	testGroup := router.Group("test")
	{
		// http://localhost:8000/api/v1/test/hello?code=1004
		testGroup.GET("hello", func(context *gin.Context) {
			//code := context.DefaultQuery("code", "code")
			// 获取参数
			code := context.Query("code")
			//if exist {
			//	fmt.Println("返回的参数出错：", code)
			//}
			code2, err := strconv.Atoi(code)
			if err != nil {
				fmt.Println("返回的参数转换出错：", code2)
			}
			fmt.Println(code)
			fmt.Println(code2)
			context.JSON(http.StatusOK, gin.H{
				"msg": msg.GetErrorMsg(code2),
			})
		})
	}

	_ = r.Run(utils.HttpPost)
}
